import re
from typing import Dict

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain_core.output_parsers import BaseOutputParser

from .prompt_config import PromptConfig
params = PromptConfig()

class SqlErrorSolutionParser(BaseOutputParser):
    """解析SQL错误解决方案的自定义解析器，适配Markdown格式输出"""

    def parse(self, text: str) -> Dict[str, any]:
        """
        解析AI输出的文本，提取错误原因和解决方案（含代码）

        返回格式：
        {
            "error_reason": str,          # 错误原因描述
            "solutions": [                # 解决方案列表
                {
                    "title": str,         # 方案标题（如"解决方案1：截断用户名"）
                    "content": str,       # 方案文字说明
                    "code": str           # 方案对应的SQL代码
                },
                ...
            ]
        }
        """
        result = {"error_reason": "", "solutions": []}

        # 1. 提取错误原因（匹配### 错误原因后的内容）
        error_reason_pattern = r'### 错误原因\n(.*?)(?=### 解决方案|\Z)'
        error_match = re.search(error_reason_pattern, text, re.DOTALL)
        if error_match:
            result["error_reason"] = error_match.group(1).strip()

        # 2. 提取所有解决方案（匹配### 解决方案后的内容）
        solution_pattern = r'### (解决方案\d+：.*?)\n(.*?)(?=### 解决方案|\Z)'
        solutions = re.findall(solution_pattern, text, re.DOTALL)

        for title, content in solutions:
            # 3. 从方案内容中提取SQL代码块（```sql和```之间的内容）
            code_pattern = r'```sql\n(.*?)\n```'
            code_match = re.search(code_pattern, content, re.DOTALL)
            code = code_match.group(1).strip() if code_match else ""

            # 4. 提取方案的文字说明（去除代码块后的内容）
            if code_match:
                # 移除代码块部分，保留纯文字说明
                content_clean = re.sub(code_pattern, '', content, flags=re.DOTALL).strip()
            else:
                content_clean = content.strip()

            # 添加到结果列表
            result["solutions"].append({
                "title": title.strip(),
                "content": content_clean,
                "code": code
            })

        return result

    def get_format_instructions(self) -> str:
        """提示AI按指定格式输出，确保解析器可正确提取内容"""
        return """请按照以下格式输出SQL错误解决方案："""
